package com.test.ayi.controller;

import com.test.ayi.config.SpelAnnotation;
import com.test.ayi.service.BusinessService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import java.util.List;
import java.util.Map;

/**
 * SpEL表达式示例控制器
 * 展示如何使用SpEL访问环境变量和配置属性
 */
@RestController
@RequestMapping("/api")
public class HelloController {
    @Autowired
    private BusinessService businessService;
    // 1. 使用SpEL访问环境变量（基本用法）
    @SpelAnnotation("#{#environment.getProperty('server.port', '8080')}")
    private String currentPort;

    // 2. 使用SpEL访问环境变量（带数学运算）
    @SpelAnnotation("#{T(Integer).parseInt(#environment.getProperty('server.port', '8080')) + 1}")
    private int nextPort;

    // 3. 使用SpEL访问环境变量（带条件判断）
    @SpelAnnotation("#{T(Integer).parseInt(#environment.getProperty('server.port', '8080')) > 8000 ? '高位端口' : '低位端口'}")
    private String portType;

    // 1. 调用Bean的方法
    @SpelAnnotation("#{@test.test('longlong')}")
    private String spelBeanMethod;

    // 2. 字符串操作
    @SpelAnnotation("#{'Hello'.concat(' World')}")
    private String spelString;

    // 3. 数学运算
    @SpelAnnotation("#{19 + 84}")
    private int spelMath;

    // 4. 三元运算符
    @SpelAnnotation("#{2 > 1 ? '是' : '否'}")
    private String spelTernary;

    // 5. 调用静态方法和常量
    @SpelAnnotation("#{T(java.lang.Math).random()}")
    private double spelStatic;

    // 6. 正则表达式匹配
    @SpelAnnotation("#{'^[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\\\\.[A-Za-z]{2,6}$' matches 'user@example.com'}")
    private boolean spelRegex;

    // 7. 列表操作
    @SpelAnnotation("#{{'张三', '李四', '王五'}}")
    private List<String> spelList;

    // 8. Map操作
    @SpelAnnotation("#{{1:'一', 2:'二', 3:'三'}}")
    private Map<Integer, String> spelMap;


    // 12. 使用改进后的SpelAnnotation支持属性占位符
    @SpelAnnotation("${server.port}")
    private String portFromProps;
    @SpelAnnotation("${love}")
    private String love;


    @GetMapping("/spel")
    public Map<String, Object> spel() {

        return Map.of(
                "调用Bean方法", spelBeanMethod,
                "字符串操作", spelString,
                "数学运算", spelMath,
                "三元运算符", spelTernary,
                "静态方法调用", spelStatic,
                "正则表达式匹配", spelRegex,
                "列表操作", spelList,
                "Map操作", spelMap,
                "portFromProps", portFromProps,
                "your love", love
        );
    }

    @GetMapping("/config")
    public Map<String, Object> getConfig() {
        return Map.of(
                "当前端口", currentPort,
                "下一个端口", nextPort,
                "端口类型", portType
        );
    }

    @GetMapping("/hello")
    public String hello() throws InterruptedException {
        System.out.println("i love littleLuoli!!!!!!!!!!!!!!!!!!!!!!!!!!!");
        Thread.sleep(2000);
        return "hello";
    }

    @GetMapping("/business")
    public String business() {
        businessService.performBusinessOperation();
        return "business";
    }

    @GetMapping("/counter")
    public String counter() {
        businessService.counter();
        return "counter";
    }

    @GetMapping("/gauge")
    public String gauge() {
        businessService.gauge();
        return "gauge";
    }
}
